#include <iostream>
#include <cstdio>
#include <string>
#include <ctime>
#include <cstdlib>
#include <cstdint>
#include <unistd.h>
#include <sys/timerfd.h>
#include <sys/select.h>

int main()
{
    /*创建一个定时器 */
    /*
        int timerfd_create(int clockid, int flags);
            clockid： CLOCK_REALTIME-系统实时时间，如果修改了系统时间就会出问题；   CLOCK_MONOTONIC-从开机到现在的时间是一种相对时间；
            flags: 0-默认阻塞属性
    */
    int timerfd = timerfd_create(CLOCK_MONOTONIC, 0);
    
    struct itimerspec itm;
    itm.it_value.tv_sec = 3;//设置第一次超时的时间
    itm.it_value.tv_nsec = 0;
    itm.it_interval.tv_sec = 3;//第一次超时后，每隔多长时间超时
    itm.it_interval.tv_nsec = 0;
    timerfd_settime(timerfd, 0, &itm, NULL);//启动定时器
    /*这个定时器描述符将每隔三秒都会触发一次可读事件*/
    time_t start = time(NULL);
    while(1) {
        uint64_t tmp;
        /*需要注意的是定时器超时后,则描述符触发可读事件，必须读取8字节的数据，保存的是自上次启动定时器或read后的超时次数*/
        int ret = read(timerfd, &tmp, sizeof(tmp));
        if (ret < 0) {
            return -1;
        }
        std::cout << tmp << " " << time(NULL) - start << std::endl;
    }
    close(timerfd);

    return 0;
}